package cn.hchaojie.javase.day04;

import static org.junit.Assert.assertArrayEquals;

import org.junit.Test;

public class ArraySort {
	@Test
	public void test() {
		int[] a1 = {1, 5, 16}, a2 = {3, 4, 6, 7};
		
		int[] check = {1, 3, 4, 5, 6, 7, 16};
		
		assertArrayEquals(check, merge(a1, a2));
		assertArrayEquals(check, merge(a2, a1));
	}
	
	/**
	 * 合并两个数组（两个数组已经是升序排序的），返回一个新的升序排序的数组。
	 * 
	 * @param a1
	 * @param a2
	 * @return
	 */
	public static int[] merge(int[] a1, int[] a2) {
		int[] merge = new int[a1.length + a2.length];
		
		int i = 0;
		int j = 0;
		int k = 0;
		
		// 第一步：依次从a1, a2取元素，直到其中一个数组元素取完
//		while (i < a1.length && j < a2.length) {
//			if (a1[i] > a2[j]) {
//				merge[k] = a2[j];
//				j++;
//			} else if (a1[i] < a2[j]) {
//				merge[k] = a1[i];
//				i++;
//			} else {
//				merge[k] = a1[i];
//				i++;
//				k++;
//				merge[k] = a2[j];
//				j++;
//			}
//			k++;
//		}
		while (i < a1.length && j < a2.length) {
			if (a1[i] > a2[j]) {
				merge[k] = a2[j];
				j++;
			} else {
				merge[k] = a1[i];
				i++;
			}
			k++;
		}
		
		// 第二步：把没取完的数组剩余元素加到合并数组的后面
		//if (i < a1.length) {
			// 第一个数组没取完的情况
			for (; i < a1.length; i++) {
				merge[k] = a1[i];
				k++;
			}
		//}  

			// 第二个数组没取完的情况
			for (; j < a2.length; j++) {
				merge[k] = a2[j];
				k++;
			}
		
		return merge;
	}
}
